linux gcc 编译找不到头文件,找不到库 |
您所在的位置:网站首页 › makefile指定库路径 找不到 › linux gcc 编译找不到头文件,找不到库 |
找不到头文件
解决方式 (头文件均为编译时刻使用)
1、把头文件路径写成绝对路径,把路径写全,如 (相对路径也行) #include "/usr/include/stdio.h"2、软链接到include默认路径下,或者直接拷贝 # 符号链接 ln -s /usr/include/ffmpeg/libavcodec/ /usr/include/ # 直接拷贝 cp -r ffmpeg/* /usr/include/注意,删除符号链接文件夹使用 # 无论是删除符号链接文件还是文件夹,都是直接rm,删除符号链接文件夹请勿加上 / 如 rm libavcodec/ # 如果使用 rm -rf libavcodec/ 会导致源文件丢失,符号链接还在 rm libavcodec3、gcc 增加 -i(大写) 选项指定路径,可以有多个 -i gcc -o a.out a.c -I /usr/include/4、修改Makefile文件 有些gcc编译是在Makefile里的,方法同3,只是修改Makefile里的C_FLAG,具体情况具体分析,我只是举个例子 makefile指定头文件路径_玩转Makefile:企业项目Makefile实例_weixin_39607474的博客-CSDN博客 5、临时添加环境变量 (未实操) (2022.12.7 补充) C和C++头文件 export C_INCLUDE_PATH=/opt/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/opt/include:$CPLUS_INCLUDE_PATHEnvironment Variables (The C Preprocessor) 记录我是编译freerdp的时候发现报错 /root/freerdp/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c:26:32: 致命错误:libavcodec/avcodec.h:没有那个文件或目录 #include我安装了 ffmpeg-devel 没效果 yum install ffmpeg-devel原因是因为这个头文件库被放在 /usr/include/ffmpeg/ ,而编译的代码写的头文件为 #include ,加上系统路径就是 /usr/include/libavcodec/avcodec.h ,这肯定找不到啊,因为实际路径是 /usr/include/ffmpeg/libavcodec/avcodec.h,于是就有了上面的办法 找不so库文件 解决方式1、增加-L编译选项,-L可以加多个 (编译时刻) 默认路径一般在 /usr/lib /usr/lib64,把so文件拷贝到这里也行,或者软链接到这里,修改Makefile文件等,跟前面找不到头文件做差不多的事情 gcc -o a.out a.c -lpthread -L /usr/lib642、临时添加环境变量 (编译时刻) (2022.12.7 补充) 从其他地方搜刮来的,未实操,可以参考 export LD_RUN_PATH=/usr/local/openssl-1.1.1/lib/不确定能不能这么用 export LD_RUN_PATH=/opt/lib:$LD_RUN_PATH3、添加到系统so库路径中 (运行时刻) echo /usr/local/lib >> /etc/ld.so.conf ldconfig4、临时添加环境变量 (运行时刻) export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH特殊情况下 (编译时刻) 比如 A 依赖 B,B 依赖 C B在系统 /lib 路径下,而 C 不在系统路径下,这个时候可以使用 LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/C/lib:$LD_LIBRARY_PATH 说明编译时刻比如说so文件,要么 -L 指定路径,要么把文件拷贝到默认目录下,目前没有找到办法修改官方指定的编译路径,但是软件运行时刻的路径可以我们指定 编译时刻貌似也能指定路径(2022.12.7 补充) 核心思路很多报错都是在configure里的,比如 configure: WARNING: -------------------------------------------- Unable to find libssl --------------------------------------------最好是直接写个简单的程序,如 gcc -o a.out a.c -lssl看看能不能编译通过,有的configure不仅仅检查库文件,还检查头文件是否存在,另外,如果库文件存在的话最好 ldd 一下看下这个库下面的引用库是否存在 linux加载动态运行库失败_qq_38781075的博客-CSDN博客_linux 加载动态库失败 是不是存在 not found libssl.so.1.1 => not found有就要解决 还有,有些configure是根据pkg判断的,如果你是手动编译的依赖,一定要把安装目录下的pc文件拷贝到 /usr/lib64/pkgconfig/ # 比如这样检测 /usr/bin/pkg-config --exists --print-errors "openssl >= 0.9.8" # 记得拷贝pc文件 cp /root/rpmbuild/BUILD/openssl-1.0.2u/*.pc /lib64/pkgconfig/ ldconfig如果有必要的话,pc文件的路径也最好检查下,里面有 include 和 lib 的路径,看看是否正确 cat /lib64/pkgconfig/freerdp.pc prefix=/usr/local/freerdp exec_prefix=/usr/local/freerdp libdir=/usr/local/freerdp/lib64 includedir=/usr/local/freerdp/include Name: FreeRDP Description: A free remote desktop protocol client URL: http://www.freerdp.com/ Version: 1.0.2 Requires: Libs: -L${libdir} -lfreerdp-core -lfreerdp-codec -lfreerdp-gdi -lfreerdp-kbd -lfreerdp-rail -lfreerdp-channels -lfreerdp-utils Cflags: -I${includedir}还有就是,如果你是 configure 文件编译,你可以留意一下里面是不是有类似 LDFLAGS 之类的 flag 字段,我们手动加上库的路径,不过这个是具体情况具体分析了 export LDFLAGS="-L/usr/local/lib -L/usr/local/lib64" 此外有些运行时找不到库也需要关注,有些库编译时,把原路径硬编码到so库里的,如果你的库是从其它地方(不同机器)拷贝过来的话,(并且拷贝过来的位置和原来不一样)也可能出问题,这种情况下,建议重新编译,编译目标路径选择同一个位置,再拷贝 freerdp_load_library_symbol: failed to open /lib64/freerdp/cliprdr.so |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |